// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

//引入tcb-router模块
const TcbRouter = require('tcb-router')

//初始化数据库
const db = cloud.database()

//把数据库的集合放到一个常量中，方便随时调用
const blogCollection = db.collection('blog')

//假设一个可查询的条数
const MAX_LIMIT = 100

// 云函数入口函数
exports.main = async (event, context) => {
  const app = new TcbRouter({
    event
  })

  //创建一个获取博客信息
  app.router('list',async (ctx,next) => {
    //因为博客信息中没有关键字，所以需要再这里进行添加，通过event传递进来
    const keyword = event.keyword
    //创建一个空对象，用户进行模糊查询
    let w = {}
    //判断是否是空，如果是空，那么不进行查询
    if (keyword.trim() != '') {
      //如果不等于空，那么设定一个规则，就是数据库中的content是否等于keyword
      w = {
        content:db.RegExp({
          regexp:keyword,
          options:'i' //忽略大小写
        })
      }
    }

    let blogList = await blogCollection.where(w).skip(event.start).limit(event.count).orderBy('createTime','desc').get().then((res)=>{
      return res.data
    })
    ctx.body = blogList
  })

  //详情查询
  app.router('detail',async (ctx,next) => {
    let blogId = event.blogId
    //where指定查询条件，返回带新查询条件的新的集合引用,详情查询
    let detail = await blogCollection.where({
      _id:blogId
    }).get().then((res)=>{
      return res.data
    })
    //评论查询
    //获取总共的数据，但是返回的是一个对象，需要total转换数字
    const countResult = await blogCollection.count()
    //将countResult返回的对象转换为数字
    const total = countResult.total
    //评价列表
    let commentList = {
      data:[]
    }
    //判断，如果有评论才去查询，否则不查询
    if (total > 0) {
      //查询的次数,通过向上取整，看几次能查询到
      const batchTimes = Math.ceil(total / MAX_LIMIT)
      //存放后面的promise对象
      const tasks = []
      for (let i = 0; i < batchTimes;i++) {
        let promise = db.collection('blog-comment').skip(i * MAX_LIMIT).limit(MAX_LIMIT).where({
          blogId
        }).orderBy('createTime','desc').get()
        tasks.push(promise)
      }
      //判断当前数组大于0，那么调用promise.all方法
      if (tasks.length > 0) {
        //reduce累加器，把每次的结果累加到当前的结果
        commentList = (await Promise.all(tasks)).reduce((acc,cur) => {
          return {
            //把上次的结果拼接到本次循环对应的值
            data:acc.data.concat(cur.data)
          }
        })
      }
    }
    ctx.body = {
      commentList,
      detail,
    }
  })

  //我的发现
  //取到openid
  const wxContext = cloud.getWXContext()
  app.router('getListByOpenid',async(ctx,next)=>{
    ctx.body =  await blogCollection.where({
      _openid:wxContext.OPENID
    }).skip(event.start).limit(event.count).orderBy("createTime",'desc').get().then((res)=>{
      return res.data
    })
  })

  return app.serve()
} 